package com.admin.system.modules.system.util;

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.ObjectUtil;
import com.admin.common.utils.StringUtils;
import com.admin.core.entity.SysMenu;
import com.admin.system.modules.system.dto.MenuMetaDTO;
import com.admin.system.modules.system.dto.MenuTreeDTO;
import com.admin.system.modules.system.dto.MenuVo;
import org.springframework.beans.BeanUtils;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

/**
 * 树
 *
 * @author sq-lan
 */
public class TreeUtil {

    public static List<MenuTreeDTO> build(List<SysMenu> menus) {
        List<MenuTreeDTO> trees = new ArrayList<>();
        // Set<Integer> ids = new HashSet<>();
        for (SysMenu menu : menus) {
            MenuTreeDTO tree = new MenuTreeDTO();
            if (menu.getPid() == null) {
                BeanUtils.copyProperties(menu, tree);
                trees.add(tree);
            }
            for (SysMenu it : menus) {
                if (menu.getId().equals(it.getPid())) {
                    if (tree.getChildren() == null) {
                        tree.setChildren(new ArrayList<>());
                    }
                    MenuTreeDTO child = new MenuTreeDTO();
                    BeanUtils.copyProperties(it, child);
                    tree.getChildren().add(child);
                    // ids.add(it.getId());
                }
            }
        }
        /*if (trees.size() == 0) {
            trees = menus.stream().filter(s -> !ids.contains(s.getId())).collect(Collectors.toList());
        }*/
        return trees;
    }

    public static List<MenuVo> handelMenuRoute(List<MenuTreeDTO> menus) {
        List<MenuVo> list = new LinkedList<>();
        for (MenuTreeDTO menu : menus) {
            List<MenuTreeDTO> children = menu.getChildren();
            MenuVo menuVo = new MenuVo();
            menuVo.setName(ObjectUtil.isNotEmpty(menu.getComponentName()) ? menu.getComponentName() : menu.getTitle());
            // 一级目录需要加斜杠，不然会报警告
            menuVo.setPath(menu.getPid() == null ? "/" + menu.getPath() : menu.getPath());
            menuVo.setHidden(menu.getHidden());
            // 如果不是外链
            if (!menu.getIFrame()) {
                if (menu.getPid() == null) {
                    menuVo.setComponent(StringUtils.isEmpty(menu.getComponent()) ? "Layout" : menu.getComponent());
                    // 如果不是一级菜单，并且菜单类型为目录，则代表是多级菜单
                } else if (menu.getType() == 0) {
                    menuVo.setComponent(StringUtils.isEmpty(menu.getComponent()) ? "ParentView" : menu.getComponent());
                } else if (StringUtils.isNoneBlank(menu.getComponent())) {
                    menuVo.setComponent(menu.getComponent());
                }
            }
            menuVo.setMeta(new MenuMetaDTO(menu.getTitle(), menu.getIcon(), !menu.getCache()));
            if (CollectionUtil.isNotEmpty(children)) {
                menuVo.setAlwaysShow(true);
                menuVo.setRedirect("noredirect");
                menuVo.setChildren(handelMenuRoute(children));
                // 处理是一级菜单并且没有子菜单的情况
            } else if (menu.getPid() == null) {
                MenuVo menuVo1 = new MenuVo();
                menuVo1.setMeta(menuVo.getMeta());
                // 非外链
                if (!menu.getIFrame()) {
                    menuVo1.setPath("index");
                    menuVo1.setName(menuVo.getName());
                    menuVo1.setComponent(menuVo.getComponent());
                } else {
                    menuVo1.setPath(menu.getPath());
                }
                menuVo.setName(null);
                menuVo.setMeta(null);
                menuVo.setComponent("Layout");
                List<MenuVo> list1 = new ArrayList<>();
                list1.add(menuVo1);
                menuVo.setChildren(list1);
            }
            list.add(menuVo);
        }
        return list;
    }
}
